首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏tech with leo

    Go Context解析 A Brief Inquiry Into Go Context

    最后一项处理并发也就是Go语言的一大特性,这也就能理解为什么Go需要context来作为并发控制中重要的一环。 众所周知,Go语言有四个进行并发控制的工具 全局变量 channel waitgroup context 要理解为什么context也是其中不可或缺的一环,不妨可以提出一个疑问: 如果没有context 但是任然存在一些值得斟酌的点,以下观点并非全部来自个人,仅供讨论 Context everywhere! Contextgo代码中像病毒一样蔓延,即使是不需要的代码也需要传递context。 正是因为contextgo代码中到处蔓延,所以才会出现context.TODO()这种让人匪夷所思的东西 valueCtx是否有必要?为什么用一个链表实现了map? /a/1190000019862527 https://faiface.github.io/post/context-should-go-away-go2/

    1.1K73编辑于 2021-11-26
  • 来自专栏代码工具

    go context详解

    背景在介绍context之前, 必须知道:main 函数退出,所有协程都会退出func main() { // 合起来写 go func() { i := 0 for { context使用当我们的上一级goroutine停止时, 我们希望它下级的所有goroutine也能收到这个通知及时停止, 防止资源浪费.func main() { go func() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() go func(ctx context.Context 即只能从上层goroutine往下层的goroutine传递(父goroutine往子goroutine传递)Go context 使用嵌入类,以类似继承的方式组织几个 Context 类: emptyCtx 常用组件对context的依赖情况组件名称组件功能是否需要显示传递context主要作用go-redisgo redis客户端是连接超时/异常取消go-sql-drivergo mysql 驱动否连接超时

    2.2K50编辑于 2022-06-30
  • 来自专栏涓流

    go context原理

    go 语言开发中, context 用于提供上下文的联系, 在不同协程调用间建立取消和超时机制,也可以用于传递相关值。 context 源码 go 提供了几种不同类型的 context, 他们都实现了 context.Context 接口: type Context interface { // 返回 context // 在函数退出后被取消 go doSomething1(ctx) go doSomething2(ctx) } WithCancel 创建源码 func WithCancel(parent 是开发者自定义的类型 // 开启一个新的协程,监听父子上下文取消的信号 goroutines.Add(1) go func() { select { case <-parent.Done 通过 context 来控制 http 请求超时 go net 包下, 使用 httpclient 发起请求示例如下: client := http.Client{ // 设置超时时间 Timeout

    41110编辑于 2024-04-01
  • 来自专栏程序员奇点

    Go Context 简介

    Context 上下文 context.Context Go 语言中用来设置截止日期,同步信号,传递请求相关的结构体,context 与 gotoutine 有比较密切的关系,是 Go 语言中的独特设计 WithValue 是一对 kv 类型,可用来传值,实际应用:传递全局唯一的调用链 Context 接口 ContextGo 语言在 1.7 版本引入的标准库接口,有以下需要实现的方法 Deadlime cancel() go handle(ctx, 500*time.Millisecond) select { case <-ctx.Done(): fmt.Println("main", (context.Background()) for i := 0; i < 5; i++ { go func(i int, ctx context.Context) { for { /src/context/context.go#L519

    66230发布于 2021-07-05
  • 来自专栏Frames of Wenxing

    深入GoContext

    源码与解析 源码来自go 1.17.3。 emptyCtx, Background()与TODO() // 一个emptyCtx不能被取消、没有Values或deadline。 答案是: false 0x119e408, 0x119e408, true 我们用go run -gcflags '-m' main.go运行,可以发现: . /main.go:19:2: moved to heap: s1 ./main.go:19:6: moved to heap: s2 . /main.go:20:43: &s1 == &s2 escapes to heap . (key) } 对Context的批评(并尝试回应) 批评 Michal Štrba在文章Context should go away for Go 2中批评了Context的设计,甚至说: If you

    1K20编辑于 2021-12-14
  • 来自专栏code人生

    go 上下文:context.Context

    Go语言中的上下文(Context)是一种用于在 Goroutines 之间传递取消信号、截止时间和其他请求范围值的标准方式。 创建上下文在 Go 中,上下文可以通过 context.Background() 创建,它是一个无值的上下文,通常用作根上下文。根上下文不能被取消,也不能传递截止时间。 (context.Background()) defer cancel() // 启动 Goroutine,传递上下文 go myFunction(ctx) // 主 Goroutine ctx, cancel := context.WithCancel(context.Background())// 启动 Goroutine,传递上下文go func(ctx context.Context 传递上下文go func(ctx context.Context) { select { case <-ctx.Done(): // 上下文超时,执行清理工作 fmt.Println

    58330编辑于 2023-11-16
  • 来自专栏【腾讯云开发者】

    Go组件:context学习笔记!

    导语 | 最近学习go有一段时间了,在网上一直看到别人推荐,学go可以学习里面的context源码,短小精悍。 一、为什么使用Context (一)go的扛把子 要论go最津津乐道的功能莫过于go强大而简洁的并发能力。 func main(){ go func(){ fmt.Println("Hello World") }()} 通过简单的go func(){},go可以快速生成新的协程并运行。 因为这个方法实在是太常用了,比如grpc-go里的metadata就使用这个方法将结构体存储在ctx里。 (二)Context类图 从类图中可以看出,源码里有4种结构和3种接口,相对于其他go库源码来说是比较简单的。 核心的接口是Context,里面包含了最常用的判断是否处理完成的Done()方法 。

    60510编辑于 2022-08-26
  • 来自专栏利志分享

    gocontext使用讲解

    go的语言中context是我们常用中常说的上下文,context在我们业务中也是经常使用的,其主要的应用1:上下文控制:io处理异常等处理,多个goroutine之间的数据交互等,2:超时控制:到某个时间点超时 ---- 1:context手动去掉的使用 根context:通过context.Background()创建 子context:context.WithCancel(parentContext)创建 ctx,cancel:=context.WithCancel(context.Background()) 当前context被取消时 基于他的子context都会被取消 接收取消通知 <-ctx.Done (context.Background()) for i := 0; i < 5; i++ { go func(i int, ctx context.Context) { for 使用我们就讲到这里了,我们业务中可能经常会用到context,学会context是极其重要的。

    61320编辑于 2022-04-25
  • 来自专栏光华路程序猿

    手摸手Go Context探秘

    使用Go作为服务端开发时,每个请求过来都会分配一个goroutine来处理,请求处理过程中,可能还会创建额外的goroutine访问DB或者RPC服务。 当一个Context取消,所有从这个对象衍生的Context都会被取消。 () e := make(chan error, 1) go func() { e <- f() }() select { case err := <-e: return err case 、timerCtx、valueCtx,他们都实现了context.Context接口 // Context的方法是线程安全的 type Context interface { // 返回context ]struct{}) } p.children[child] = struct{}{} } p.mu.Unlock() } else {//找不到父可取消context go

    32820编辑于 2022-06-29
  • 来自专栏FunTester

    Go 语言 context 包实践

    Go 语言中,基于 goroutine 进行上下文管理的就是本文的主角 context 包。 简介 Go 语言的 context 包是在 Go 1.7 版本引入的,用于在不同的 goroutine 之间传递请求范围内的值、取消信号和截止日期。 ctx := context.Background() TODO 在 Go 语言的 context 包中,context.TODO() 返回一个空的上下文,它与 context.Background( ctx := context.TODO() WithCancel 在 Go 语言的 context 包中,context.WithCancel 返回一个可取消的上下文及其取消函数。 WithTimeout 在 Go 语言的 context 包中,context.WithTimeout 是一个非常常用的函数,它创建一个带有超时的上下文。

    45410编辑于 2024-07-30
  • 来自专栏一个会写诗的程序员的博客

    Go 并发模式: context.Context 上下文详解

    4.如果不确定要使用哪个 Context,请传递 context.TODO。 ... } 源码阅读 // Copyright 2014 The Go Authors. The go vet tool checks that CancelFuncs are used on all // control-flow paths. // // Programs that use struct{}{} } p.mu.Unlock() } else { atomic.AddInt32(&goroutines, +1) go (key) } 参考资料 https://blog.golang.org/context https://pkg.go.dev/context

    1.6K30编辑于 2022-05-13
  • 来自专栏飞雪无情的博客

    Go语言实战笔记(二十)| Go Context

    所以我们需要一种可以跟踪goroutine的方案,才可以达到控制他们的目的,这就是Go语言为我们提供的Context,称之为上下文非常贴切,它就是goroutine的上下文。 下面我们就使用Go Context重写上面的示例。 func main() { ctx, cancel := context.WithCancel(context.Background()) go func(ctx context.Context) func main() { ctx, cancel := context.WithCancel(context.Background()) go watch(ctx,"【监控1】") go watch 接口并不需要我们实现,Go内置已经帮我们实现了2个,我们代码中最开始都是以这两个内置的作为最顶层的partent context,衍生出更多的子Context

    1K30发布于 2018-08-28
  • 来自专栏Golang语言开发栈

    Go 语言 context 最佳实践

    01 介绍 Go 语言在 v1.7 引入 context 包,关于它的使用方式,我们在之前的文章中已经介绍过,感兴趣的读者朋友们可以翻阅。 func main() { ctx := context.WithValue(context.Background(), "ctxKey1", "ctxVal") go func(ctx context.Context (context.Background(), "ctxKey1", ctxVal) go func(ctx context.Context) { // 读取 ctx 的 value data, (context.Background(), "ctxKey1", ctxVal) go func(ctx context.Context) { // 读取 ctx 的 value data, 参考资料: https://go.dev/talks/2014/gotham-context.slide#29 https://go.dev/blog/context

    1K30编辑于 2022-12-27
  • 来自专栏灰子学技术

    Go并发之Context

    前言介绍:在学习Go并发的时候,我们总是能够看到context,而这个context却只在go语言中存在。笔者在看到context的时候,便问了自己几个问题。 context是什么?是用来干什么的? 为什么Go需要context,它是用来干什么的? 调用cancel()之后的效果如下所示: (图片来自:https://zhuanlan.zhihu.com/p/34417106) 参考资料: 理解 Go Context 机制:https://juejin.im /entry/58088180c4c971005879b184 Go进阶01:golang context 用法详解:https://mojotv.cn/2018/12/26/what-is-context-in-goContext的使用场景:https://www.cnblogs.com/yjf512/p/10399190.html Go Context的踩坑经历:https://zhuanlan.zhihu.com

    76740编辑于 2023-10-30
  • 来自专栏陌无崖知识分享

    Go Context深入学习笔记

    Context介绍 Context被称之为上下文,用它我们可以,它可以实时跟踪我们的每一个Go协程,有了这个特性,我们只需要了解怎么使用就可以了。 小试牛刀 func main() { ctx, cancel := context.WithCancel(context.Background()) go func(ctx context.Context 让我们紧接着再来看一段代码: func main() { ctx, cancel := context.WithCancel(context.Background()) go Run(ctx," 协程1正在运行") go Run(ctx,"协程2正在运行") go Run(ctx,"协程3正在运行") time.Sleep(10 * time.Second) fmt.Println 转载请联系作者 本文笔记参考: https://www.flysnow.org/2017/05/12/go-in-action-go-context.html https://draveness.me

    87910发布于 2019-08-16
  • 来自专栏飞鸟的专栏

    Go-标准库-context(二)

    可以通过context.WithValue函数将一个值保存到context中,然后在需要的地方通过context.Value函数获取该值。 )func main() {ctx := context.WithValue(context.Background(), nameKey, "Alice")ctx = context.WithValue 实际应用context包被广泛用于Go中的网络编程和多线程编程中。在网络编程中,可以使用context包来传递请求的截止时间和取消信号,以便控制网络连接的超时和关闭。 ,并将其作为请求的Context。 然后,我们使用http.NewRequest函数创建了一个GET请求,并将请求的Context设置为上面创建的Cancel context

    38021编辑于 2023-04-22
  • 来自专栏码农桃花源

    深度解密Go语言之context

    context 底层实现原理 我们分析的 Go 版本依然是 1.9.2。 但它仍然是一个 Context,这是 Go 语言的一个特点。 在参考资料 【Go2应该去掉context】这篇英文博客里,作者甚至调侃说:如果要把 Go 标准库的大部分函数都加上 context 参数的话,例如下面这样: n, err := r.Read(context.TODO 【飞雪无情的博客】https://www.flysnow.org/2017/05/12/go-in-action-go-context.html 【context 源码】https://juejin.im /post/context-should-go-away-go2/ 【源码,比较详细】https://juejin.im/post/5c1514c86fb9a049b82a5acb 【Golang Context

    1K20发布于 2019-06-15
  • 来自专栏golang开发笔记

    Gocontext包的分析

    contextGo语言官方定义的一个包,称之为上下文。 Go中的context包在与API和慢进程交互时可以派上用场,特别是在提供Web请求的生产级系统中。 先决条件 在了解上下文之前,请先了解以下概念 goroutine channel ContextGo语言中 context 包允许您传递一个 "context" 到您的程序,如超时或截止日期(deadline ctx, cancel := context.WithCancel(context.Background()) go func(ctx context.Context) { for { 在处理context返回时,你应该注意任何这样的可能性。 本节后面的示例有一个完整的go程序,它说明了超时和取消功能。 在Google,我们要求Go程序员将Context参数作为传入和传出请求之间的调用路径上的每个函数的第一个参数传递。

    93260发布于 2020-09-27
  • 来自专栏golang从入门到进阶

    Go Context 取消原因:不只是 “context canceled“ 那么简单

    Gocontext取消机制,以前就类似第一种情况:你只知道contextcanceled,但不知道是客户端断连、超时、还是服务端主动关闭。 可能原因处理策略客户端主动断开✅正常,无需告警5秒超时⚠️可能需要扩容或优化服务优雅关闭重试其他节点库存服务挂了立即告警没有原因=无法精准决策=运维靠猜✨WithCancelCause:给取消加上"小作文"Go1.20 ⚠️WithTimeoutCause的"隐形陷阱"Go1.21增加了WithTimeoutCause,看起来很美:展开代码语言:GoAI代码解释ctx,cancel:=context.WithTimeoutCause 这是Go著名的"compatibilitypromise"的体现:不破坏现有代码,哪怕新API会因此有点"别扭"。️ 这是Go典型的"orthogonaldesign"(正交设计):每个组件职责单一,通过组合解决复杂场景。

    14110编辑于 2026-03-13
  • 来自专栏旅途散记

    Go context.WithCancel()的使用

    WithCancel可以将一个Context包装为cancelCtx,并提供一个取消函数,调用这个取消函数,可以Cancel对应的Context Go语言context包-cancelCtx[1] 疑问 " "fmt" "time" ) func dosomething(ctx context.Context) { var cuiChan = make(chan struct{}) go (ctx context.Context) { var cuiChan = make(chan struct{}) //go func() { // cuiChan <- struct{}{} 语言context包-cancelCtx: https://dashen.tech/2019/06/23/Go%E8%AF%AD%E8%A8%80context%E5%8C%85/#cancelCtx pkg.go.dev/context#WithCancel:: https://pkg.go.dev/context#WithCancel [4] 深入理解Golang之Context(可用于实现超时机制

    35520编辑于 2023-09-05
领券